package edu.server.dominio;

import java.util.LinkedList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import edu.server.repositorio.OrdenProvisionInsumo;
import edu.server.repositorio.RemitoInternoInsumo;
import edu.server.repositorio.RenglonOrdenProvisionInsumo;
import edu.server.repositorio.RequerimientoCompra;
import edu.server.repositorio.RequerimientoMateriales;
import edu.server.repositorio.ReservaProducto;
import edu.server.repositorio.DetalleRequerimientoMateriales;
import edu.server.util.HibernateUtil;
import edu.shared.DTO.ReservaProductoDTO;

public class Produccion {

	public Produccion() {

	}

	public boolean registrarOrdenProvisionInsumo(OrdenProvisionInsumo orden) {
		boolean result = false;

		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			Object aux = new Object();
			sec.beginTransaction();
			aux = sec.save(orden);

			for (RenglonOrdenProvisionInsumo renglon : orden.getRenglonOrdenProvisionInsumos()) {
				renglon.getId().setIdOrdenProvisionInsumo((long) aux);
				sec.save(renglon);
			}
			sec.getTransaction().commit();
			result = true;
		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}
		return result;
	}
	
	public long registrarOrdenProvisionInsumo(OrdenProvisionInsumo orden,String nada) {
		long result = -1;

		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			long aux = (Long) sec.save(orden);
			
			for (RenglonOrdenProvisionInsumo renglon : orden.getRenglonOrdenProvisionInsumos()) {
				renglon.getId().setIdOrdenProvisionInsumo(aux);
				sec.save(renglon);
			}
			sec.getTransaction().commit();
			result = aux;
		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return -1;
		}
		return result;
	}
		
	@SuppressWarnings("unchecked")
	public List<OrdenProvisionInsumo> getOrdenProvisionInsumo(int idEstado, int idEmpPor, int idEmpPara, String fecDesde, String fecHasta){
		
		List<OrdenProvisionInsumo> result = new LinkedList<OrdenProvisionInsumo>();
		
		String criterios = "";
		
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();	
		sec.beginTransaction();
		
		if(idEstado != 0){
			criterios = criterios+" where id_Estado_Orden = "+idEstado;
		}
		
		if(idEmpPor != 0){
			if(idEstado != 0){
				criterios = criterios+" and id_Pedido_Por = "+idEmpPor;
			}
			else{
				criterios = criterios+" where id_Pedido_Por = "+idEmpPor;
			}
		}
		
		if(idEmpPara != 0){
			if(idEstado != 0 || idEmpPor != 0){
				criterios = criterios+" and id_Pedido_Para = "+idEmpPara;
			}
			else{
				criterios = criterios+" where id_Pedido_Para = "+idEmpPara;
			}
		}
		if(fecDesde.compareTo("") != 0){
			if(idEstado != 0 || idEmpPor != 0 || idEmpPara != 0){
				criterios = criterios+" and fecha_Edicion between '"+fecDesde+"' and '"+fecHasta+"'";
			}
			else{
				criterios = criterios+" where fecha_Edicion between '"+fecDesde+"' and '"+fecHasta+"'";
			}		
		}		
		
		result = sec.createQuery("from OrdenProvisionInsumo"+criterios).list();
		sec.close();
		return result;
	}

	public OrdenProvisionInsumo getOrdenProvisionInsumoSegunId(long idOrden){
		
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		sec.beginTransaction();		
		
		OrdenProvisionInsumo orden = new OrdenProvisionInsumo();
		
		orden = (OrdenProvisionInsumo) sec.get(orden.getClass(), idOrden);
		
		sec.close();
		return orden;
		
		
	}
	
	@SuppressWarnings("unchecked")
	public List<RemitoInternoInsumo> getRemitosInternosInsumos(){
		
		List<RemitoInternoInsumo> result = new LinkedList<RemitoInternoInsumo>();
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		sec.beginTransaction();
		
		result = sec.createQuery("from RemitoInternoInsumo").list();
		
		sec.close();
		return result;	
	}
	
	@SuppressWarnings("unchecked")
	public List<RemitoInternoInsumo> getRemitosInternosInsumosGenerados(int idEstado){
		
		List<RemitoInternoInsumo> result = new LinkedList<RemitoInternoInsumo>();
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		sec.beginTransaction();
		
		result = sec.createQuery("from RemitoInternoInsumo where id_Estado_Remito = "+idEstado).list();
		
		sec.close();
		return result;	
	}
	
	public RemitoInternoInsumo getRemitoInternoInsumoSegunId(Long id){
		
		RemitoInternoInsumo result = new RemitoInternoInsumo();
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		sec.beginTransaction();
		result = (RemitoInternoInsumo) sec.get(result.getClass(), id);
		
		if(result != null)
			Hibernate.initialize(result.getRenglonRemitoInternoInsumos());
		
		sec.close();
		return result;
	
	}
	
	@SuppressWarnings("unchecked")
	public List<RemitoInternoInsumo> getRemitosInternosInsumosCerradosDeUnaCiertaOrdenProvisionInsumo(int idEstado, long idOrden){
		
		List<RemitoInternoInsumo> result = new LinkedList<RemitoInternoInsumo>();
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		sec.beginTransaction();
		
		result = sec.createQuery("from RemitoInternoInsumo where id_Estado_Remito = "+idEstado+" and id_Orden_Provision_Insumo = "+idOrden).list();
		
		sec.close();
		return result;
	
	}
		
	public boolean validarOrdenProvisionInsumos(Long nroOrden, int estado){

		Boolean respuesta = false;
		int result = 0;
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			result = sec.createSQLQuery("update Orden_Provision_Insumo set id_Estado_Orden = "+estado+" where id_Orden_Provision_Insumo = "+nroOrden).executeUpdate();
			sec.getTransaction().commit();
			if (result == 1)
				respuesta = true;

		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}

		return respuesta;
		
	}
	
	public boolean cerrarRemitoProvisionInsumos(Long idRemito, int estado, String fecha){

		Boolean respuesta = false;
		int result = 0;
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			result = sec.createSQLQuery("update Remito_Interno_Insumo set id_Estado_Remito = "+estado+", fecha_Cierre = '"+fecha+"' where id_Remito_Insumo = "+idRemito).executeUpdate();
			sec.getTransaction().commit();
			if (result == 1)
				respuesta = true;

		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}

		return respuesta;
		
	}
	
	public boolean cancelarRemitoProvisionInsumos(Long idRemito, int estado, String fecha){

		Boolean respuesta = false;
		int result = 0;
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			result = sec.createSQLQuery("update Remito_Interno_Insumo set id_Estado_Remito = "+estado+", fecha_Cierre = '"+fecha+"' where id_Remito_Insumo = "+idRemito).executeUpdate();
			sec.getTransaction().commit();
			if (result == 1)
				respuesta = true;

		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}

		return respuesta;
		
	}
	
	//////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public boolean cancelarOrdenesProvisionInsumos(Long nroOrden, int estado){

		Boolean respuesta = false;
		int result = 0;
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			result = sec.createSQLQuery("update Orden_Provision_Insumo set id_Estado_Orden = "+estado+" where id_Orden_Provision_Insumo = "+nroOrden).executeUpdate();
			sec.getTransaction().commit();
			if (result == 1)
				respuesta = true;

		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}

		return respuesta;
		
	}

	public boolean cerrarOrdenesProvisionInsumos(Long nroOrden, int estado, String fechaCierre){

		Boolean respuesta = false;
		int result = 0;
		Session sec = HibernateUtil.getSessionFactory().getCurrentSession();
		try {
			sec.beginTransaction();
			result = sec.createSQLQuery("update Orden_Provision_Insumo set id_Estado_Orden = "+estado+", fecha_Cierre = '"+fechaCierre+"' where id_Orden_Provision_Insumo = "+nroOrden).executeUpdate();
			sec.getTransaction().commit();
			if (result == 1)
				respuesta = true;

		} catch (HibernateException he) {
			sec.getTransaction().rollback();
			return false;
		}

		return respuesta;
		
	}
	
	/////////////////////////////////////////////////////Segunda parte.
	
	public Integer registrarRequerimientoMateriales(RequerimientoMateriales requerimientoMateriales) {
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		int id = 0;
		
		try {
			sess.beginTransaction();
			id = (Integer) sess.save(requerimientoMateriales);
			sess.getTransaction().commit();
		} 
		catch (HibernateException he) {
			sess.getTransaction().rollback();			
		} 
		
		return id;
	}
	
	public Integer registrarDetalleRequerimientoMateriales(DetalleRequerimientoMateriales detalleRequerimientoMateriales) {
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		int id = 0;
		
		try {
			sess.beginTransaction();
			id = (Integer) sess.save(detalleRequerimientoMateriales);
			sess.getTransaction().commit();
		} 
		catch (HibernateException he) {
			sess.getTransaction().rollback();			
		} 
		
		return id;
	}

	public RequerimientoMateriales buscarRequerimientoMateriales(int idRequerimientoMaterial) {

		RequerimientoMateriales requerimientoMaterial = new RequerimientoMateriales();
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		sess.beginTransaction();
		
		requerimientoMaterial = (RequerimientoMateriales) sess.createQuery("FROM RequerimientoMateriales RM" +
																			 " WHERE RM.idRequerimientoMateriales = " + idRequerimientoMaterial).list().get(0);
				
		Hibernate.initialize(requerimientoMaterial.getOrdenFabricacionGeneral().getFechaPrevistaInicio());
		Hibernate.initialize(requerimientoMaterial.getProducto().getIdProducto());
		Hibernate.initialize(requerimientoMaterial.getRequerimientoCompras());
		Hibernate.initialize(requerimientoMaterial.getReservaProductos());
		Hibernate.initialize(requerimientoMaterial.getProducto().getElementoProducto());
		Hibernate.initialize(requerimientoMaterial.getProducto().getElementoProducto().getClaseProducto());
		Hibernate.initialize(requerimientoMaterial.getProducto().getMaterialProducto());
		Hibernate.initialize(requerimientoMaterial.getProducto().getMedidaFijaProducto());
		Hibernate.initialize(requerimientoMaterial.getProducto().getMedidasVariablesEstandars());
		
		for (DetalleRequerimientoMateriales detalleRequerimientoMaterial : requerimientoMaterial.getDetalleRequerimientoMaterialeses()) {
			Hibernate.initialize(detalleRequerimientoMaterial.getMedidaVariable1());
			Hibernate.initialize(detalleRequerimientoMaterial.getMedidaVariable2());
		}
		
		sess.close();
		
		return requerimientoMaterial;	
	}
	
	public DetalleRequerimientoMateriales buscarDetalleRequerimientoMateriales(int idRequerimientoMateriales, int idDetalleRequerimiento) {

		DetalleRequerimientoMateriales detalleRequerimientoMateriales = new DetalleRequerimientoMateriales();
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		sess.beginTransaction();
		
		detalleRequerimientoMateriales = (DetalleRequerimientoMateriales) sess.createQuery("FROM DetalleRequerimientoMateriales DRM" +
									" WHERE DRM.idDetalleRequerimientoMateriales = " + idDetalleRequerimiento +
									" AND DRM.requerimientoMateriales.idRequerimientoMateriales = " + idRequerimientoMateriales).list().get(0);
		
		sess.close();
		
		return detalleRequerimientoMateriales;
	}
	
	@SuppressWarnings("unchecked")
	public List<RequerimientoMateriales> buscarRequerimientoMaterialesPorOrdenFabricacion(int idOrdenFabricacion) {

		List<RequerimientoMateriales> listaRequerimientoMateriales = new LinkedList<RequerimientoMateriales>();
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		sess.beginTransaction();
		
		listaRequerimientoMateriales = sess.createQuery("FROM RequerimientoMateriales RM" +
									" WHERE RM.ordenFabricacionGeneral.nroOrden = " + idOrdenFabricacion).list();
				
		for (RequerimientoMateriales requerimientoMaterial : listaRequerimientoMateriales) {
			Hibernate.initialize(requerimientoMaterial.getOrdenFabricacionGeneral().getFechaPrevistaInicio());
			Hibernate.initialize(requerimientoMaterial.getProducto().getIdProducto());
			Hibernate.initialize(requerimientoMaterial.getProducto().getElementoProducto());
			Hibernate.initialize(requerimientoMaterial.getProducto().getElementoProducto().getClaseProducto());
			Hibernate.initialize(requerimientoMaterial.getProducto().getMaterialProducto());
			Hibernate.initialize(requerimientoMaterial.getProducto().getMedidaFijaProducto());
			Hibernate.initialize(requerimientoMaterial.getProducto().getMedidasVariablesEstandars());
			
			for (DetalleRequerimientoMateriales detalleRequerimientoMaterial : requerimientoMaterial.getDetalleRequerimientoMaterialeses()) {
				Hibernate.initialize(detalleRequerimientoMaterial.getMedidaVariable1());
				Hibernate.initialize(detalleRequerimientoMaterial.getMedidaVariable2());
			}
		}
		
		sess.close();
		
		return listaRequerimientoMateriales;
	}
	
	public void actualizarCantidadDetalleRequerimientoMateriales(DetalleRequerimientoMateriales detallerequerimientoMateriales) {
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try {
			sess.beginTransaction();		
			sess.update(detallerequerimientoMateriales);		
			sess.getTransaction().commit();
			
		} 
		catch (HibernateException he) {
			sess.getTransaction().rollback();			
		} 
	}
	
	@SuppressWarnings("unchecked")
	public List<ReservaProducto> buscarReservaProducto(int idRequerimientoMaterial) {
		
		List<ReservaProducto> listaReservaProducto;
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		sess.beginTransaction();
		
		listaReservaProducto = sess.createQuery("FROM ReservaProducto RP " +
												"WHERE RP.requerimientoMateriales.idRequerimientoMateriales = " + idRequerimientoMaterial).list();
		
		
		for(ReservaProducto reservaProducto : listaReservaProducto) {
			Hibernate.initialize(reservaProducto.getRequerimientoMateriales().getIdRequerimientoMateriales());
			Hibernate.initialize(reservaProducto.getInventario());
		}
				
		sess.close();
		
		return listaReservaProducto;	
	}

	@SuppressWarnings("unchecked")
	public List<RequerimientoCompra> buscarRequerimientoCompra(int idRequerimientoMaterial) {
		
		List<RequerimientoCompra> listaRequerimientoCompra;
		
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		sess.beginTransaction();
		
		listaRequerimientoCompra = sess.createQuery("FROM RequerimientoCompra RC" +
													" WHERE RC.requerimientoMateriales.idRequerimientoMateriales = " + idRequerimientoMaterial).list();
		
		
		for(RequerimientoCompra requerimientoCompra : listaRequerimientoCompra) {
			Hibernate.initialize(requerimientoCompra.getRequerimientoMateriales().getIdRequerimientoMateriales());
		}
				
		sess.close();
		
		return listaRequerimientoCompra;	
	}

	public void registrarRequerimientoCompra(RequerimientoCompra requerimientoCompra) {
	
		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try {
			
			sess.beginTransaction();							
					
			sess.save(requerimientoCompra);		

			sess.getTransaction().commit();
			
		} catch (HibernateException he) {
			
			sess.getTransaction().rollback();			
		} 
	}

	public void eliminarReserva(int idReserva) {

		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		
		Transaction tx = null;
		
		try {
			
			tx = sess.beginTransaction();
			
			ReservaProducto reservaProducto = (ReservaProducto)sess.get(ReservaProducto.class, idReserva);
			
			sess.delete(reservaProducto);
			
			tx.commit();
			
		} catch (HibernateException e) {
			
			if (tx != null) {
				tx.rollback();
			}
			
			e.printStackTrace(); 
			
		} finally {
			
			//sess.close(); 
		}
	}

	public void actualizarReserva(ReservaProductoDTO reservaProductoDTO) {

		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		
	    Transaction tx = null;
	    
	    try {
	    	
	       tx = sess.beginTransaction();
	       
	       ReservaProducto reservaProducto = (ReservaProducto)sess.get(ReservaProducto.class, reservaProductoDTO.getIdReserva());
	       
	       reservaProducto.setCantidadReservada(reservaProductoDTO.getCantidadReservada());
	       
	       sess.update(reservaProducto);
	       
	       tx.commit();
	       
	    } catch (HibernateException e) {
	    	
	       if (tx!=null) {
	    	   tx.rollback();
	       }
	       
	         e.printStackTrace(); 
	         
	    } finally {
	    	//sess.close(); 
	    }	
	}

	public void registrarReservaProducto(ReservaProducto reservaProducto) {

		Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
		
	    Transaction tx = null;
	    
	    try {
	    	
	       tx = sess.beginTransaction();
	       	       	       
	       sess.save(reservaProducto);
	       
	       tx.commit();
	       
	    } catch (HibernateException e) {
	    	
	       if (tx!=null) {
	    	   tx.rollback();
	       }
	       
	         e.printStackTrace(); 
	         
	    } finally {
	    	//sess.close(); 
	    }		
	}
}
